use std::env;
use std::path::Path;

/// 演示命令行参数相关的用法
#[test]
fn args_examples() {
    // `env::args()` 返回一个迭代器，第一个元素通常是程序名
    let collected_args: Vec<String> = env::args().collect();
    println!("collected args    {:?}", collected_args);

    // 再次获取是新的迭代器，可以逐个遍历
    for arg in env::args() {
        println!("arg item          [{}]", arg);
    }

    // 使用 args_os 保留操作系统原始字符串（非 UTF-8 时很有用）
    let args_os: Vec<_> = env::args_os().collect();
    println!("args_os           {:?}", args_os);
}

/// 演示当前工作目录与可执行文件路径的获取与切换
#[test]
fn current_and_exe_examples() {
    // 获取当前工作目录（PathBuf）
    let cwd = env::current_dir();
    println!("current_dir       {:?}", cwd);

    // 获取当前运行可执行文件的完整路径
    println!("current_exe       {:?}", env::current_exe());

    // 演示临时切换当前目录，并在最后恢复
    let original = env::current_dir().expect("failed to get current dir");
    // 改变当前工作目录到根目录（示例，可能需要权限）
    let changed = env::set_current_dir("../");
    println!("set_current_dir OK? {:?}", changed.is_ok());

    let cwd = env::current_dir();
    println!("current_dir       {:?}", cwd);

    // 恢复原始目录
    let _ = env::set_current_dir(&original);
}

/// 演示 PATH 相关的 join/split 功能以及临时目录
#[test]
fn path_helpers_examples() {
    // 准备路径集合并将其连接为 PATH 风格的字符串（平台相关）
    let paths = vec![Path::new("/bin"), Path::new("/usr/bin")];
    match env::join_paths(paths) {
        Ok(os_string) => println!("join_paths        {:?}", os_string),
        Err(e) => println!("join_paths error  {:?}", e),
    }

    // 将 PATH 风格字符串按平台规则拆分成路径迭代器
    let splited: Vec<_> = env::split_paths("/bin:/usr/bin").collect();
    println!("split_paths       {:?}", splited);

    // 获取临时目录
    println!("temp_dir          {:?}", env::temp_dir());
}

/// 演示环境变量的读取、设置、删除与遍历
#[test]
fn env_vars_examples() {
    unsafe {
        // 设置环境变量（仅影响当前进程）
        env::set_var("MY_TEST_KEY", "MY_VALUE");
        println!("var MY_TEST_KEY   {:?}", env::var("MY_TEST_KEY"));
        println!("var_os MY_TEST_KEY{:?}", env::var_os("MY_TEST_KEY"));

        // 删除环境变量
        env::remove_var("MY_TEST_KEY");
        // 删除后尝试读取会返回 Err（或 None 对应 var_os）
        println!("after remove var  {:?}", env::var("MY_TEST_KEY").ok());
        println!("after remove var_os {:?}", env::var_os("MY_TEST_KEY"));
    }

    // 遍历环境变量（示例只打印前几个，避免大量输出）
    for (k, v) in env::vars().take(5) {
        println!("env item          {}={}", k, v);
    }

    // vars_os 保留原始操作系统字符串（非 UTF-8 时可用）
    for (k, v) in env::vars_os().take(5) {
        println!("env_os item       {:?}={:?}", k, v);
    }
    // 补充：环境变量相关操作
    // 获取指定环境变量
    if let Ok(val) = env::var("HOME") {
        println!("HOME 环境变量: {}", val);
    } else {
        println!("未找到 HOME 环境变量");
    }
    // 设置临时环境变量（仅当前进程有效）
    env::set_var("MY_TEMP_VAR", "123");
    println!("MY_TEMP_VAR: {:?}", env::var("MY_TEMP_VAR"));
    // 移除环境变量
    env::remove_var("MY_TEMP_VAR");
    println!("MY_TEMP_VAR after remove: {:?}", env::var("MY_TEMP_VAR"));
    // 枚举所有环境变量
    for (key, value) in env::vars() {
        println!("环境变量: {} = {}", key, value);
    }
    // 枚举所有环境变量（OsString 版本）
    for (key, value) in env::vars_os() {
        println!("环境变量(OsString): {:?} = {:?}", key, value);
    }
}
/// 演示 `env::consts` 中的平台相关常量
#[test]
fn consts_examples() {
    // 平台信息（操作系统、架构等）
    println!("OS                {:?}", env::consts::OS);
    println!("ARCH              {:?}", env::consts::ARCH);
    println!("EXE_SUFFIX        {:?}", env::consts::EXE_SUFFIX);
    println!("DLL_PREFIX        {:?}", env::consts::DLL_PREFIX);
    println!("DLL_SUFFIX        {:?}", env::consts::DLL_SUFFIX);
}
